﻿שמירת חתיכות במטמון
================

שמירת חתיכות במטמון מתייחסת לשמירה של חתיכות תוכן בעמוד. לדוגמא, אם העמוד מציג טבלה של סך הכל מכירות לשנה הזו, אנו יכולים לשמור את הטבלה במטמון כדי לחסוך את הזמן שדרוש כדי ליצור אותה בכל בקשה.

כדי לשמור חתיכה במטמון, אנו קוראים ל [CController::beginCache|CBaseController::beginCache] ו [CController::endCache|CBaseController::endCache] בתוך קובץ תצוגה של קונטרולר. שני המתודות מסמנות את תחילתו וסופו של אותה חתיכה שצריכה להשמר במטמון. בדומה ל [שמירת נתונים](/doc/guide/caching.data), יש צורך בשם כמזהה יחודי של ערך מטמון זה לצורך זיהוי המטמון.

~~~
[php]
...other HTML content...
«?php if($this-»beginCache($id)) { ?»
...content to be cached...
«?php $this-»endCache(); } ?»
...other HTML content...
~~~

בדוגמא למעלה, אם [beginCache|CBaseController::beginCache] מחזיר ערך השווה ל `false`, התוכן השמור במטמון יוכנס במקום בצורה אוטומטית; אחרת, התוכן בתוך פקודת ה  `if` יורץ וישמר במטמון בעת הגעת הקוד למתודה [endCache|CBaseController::endCache].

אפשרויות מטמון
---------------

בעת הקריאה ל [beginCache|CBaseController::beginCache], אנו יכולים להעביר מערך כפרמטר שני למתודה המכיל אפשרויות לאופן השמירה של החתיכה במטמון. למעשה, המתודות [beginCache|CBaseController::beginCache] ו [endCache|CBaseController::endCache] הם מעטפת נוחה של הוידג'ט [COutputCache]. לכן, אפשרויות המטמון יכולות להיות ערכים המגדירים את כל המאפיינים הקיימים ב [COutputCache].

### תקופת קיום

אולי האפשרות הנפוצה ביותר הינה [תקופת הזמן|COutputCache::duration] המגדירה את משך הזמן בו התוכן הנשמר במטמון תקף. הוא דומה לפרמטר התפוגה של המתודה [CCache::set]. הקוד הבא שומר את תוכן החתיכה במטמון לפרק זמן של עד שעה:

~~~
[php]
...other HTML content...
«?php if($this-»beginCache($id, array('duration'=»3600))) { ?»
...content to be cached...
«?php $this-»endCache(); } ?»
...other HTML content...
~~~

אם אנו לא מגדירים תקופת קיום, היא תוגדר לברירת מחדל של 60, האומר שהתוכן הנשמר במטמון ימחק לאחר 60 שניות.

### תלות

בדומה [מטמון נתונים](/doc/guide/caching.data), ניתן להגדיר לחתיכות הנשמרות במטמון תלות כלשהי. לדוגמא, התוכן של ההודעה המוצגת תלוי במידה וההודעה השתנתה.

כדי להגדיר תלות, אנו מגדירים את המאפיין [dependency|COutputCache::dependency], אשר יכול להיות אובייקט של מחלקה המיישמת את [ICacheDependency] או מערך של הגדרות אשר יכול ליצור את אובייקט התלות. הקוד הבא מציין את החתיכה הנשמרת במטמון בהתבסס על השינוי של הערך של המאפיין `lastModified`:

~~~
[php]
...other HTML content...
«?php if($this-»beginCache($id, array('dependency'=»array(
        'class'=»'system.caching.dependencies.CDbCacheDependency',
        'sql'=»'SELECT MAX(lastModified) FROM Post')))) { ?»
...content to be cached...
«?php $this-»endCache(); } ?»
...other HTML content...
~~~

### גיוון (וריאציה)

ניתן לשמור את התוכן בהתבסס על פרמטרים מסויים כדי לגוון זאת. לדוגמא, הפרופיל האישי יכול להראות שונה למשתמשים שונים. כדי לשמור את הפרופיל האישי במטמון, אנו נרצה שהתוכן הנשמר במטמון ישמר בהתבסס על מספר המשתמש הצופה בו כרגע. זה אומר שאנו צריכים להשתמש בשמות שונים בעת קראיה ל [beginCache()|CBaseController::beginCache()].

במקום לבקש מהמתכנתים לגוון במזהים היחודיים בהתבסס על תבנית מסויימת, [COutputCache] כבר מכילה אפשרות כזו מובנית. למטה תקציר בנוגע לשימוש באפשרות זו.

- [varyByRoute|COutputCache::varyByRoute]: על ידי הגדרת אפשרות זו ל `true`, התוכן הנשמר במטמון יגוון על ידי [הקישור](/doc/guide/basics.controller#route). לכן, כל קומבינציה של פעולה וקונטרולר התוכן שישמר יהיה שונה.

- [varyBySession|COutputCache::varyBySession]: על ידי הגדרת אפשרות זו ל `true`, התוכן הנשמר במטמון יגוון על ידי המזהה היחודי (session) של המשתמש. לכן, כל משתמש יראה תוכן שונה המגיע ישירות מהמטמון.

- [varyByParam|COutputCache::varyByParam]: על ידי הגדרת אפשרות זו למערך של שמות, ניתן לגוון את המטמון שנשמר בהתבסס על הערכים המגיעים מהפרמטרים של GET. לדוגמא, אם עמוד מציג את התוכן של ההודעה על פי מספרה - `id` המגיע מהפרמטר בקישור (GET) , ניתן להגדיר את [varyByParam|COutputCache::varyByParam] בתור `array('id')` כדי שכל הודעה תשמר במטמון. ללא גיוון זה ושמירה על פי הפרמטר, יכולנו לשמור הודעה אחת בלבד במטמון.

- [varyByExpression|COutputCache::varyByExpression]: על ידי הגדרת אפשרות זו לביטוי ב PHP, ניתן לגוון את התוכן הנשמר בהתבסס על התוצאה של הביטוי. אפשרות זו קיימת מגרסאות 1.0.4 ומעלה.

### סוגי בקשות

לפעמים אנו נרצה לשמור חתיכה במטמון רק לסוגי בקשות מסויימות (GET או POST). לדוגמא, עמוד המציג טופס, אנו רוצים לשמור אותו רק כשהוא מבוקש לראשונה (דרך GET). כל שאר הבקשות לאותו הטופס (דרך POST) לא צריכות להשמר במטמון מאחר והם יכולים להכיל מידע שהמשתמש הזין. כדי לבצע זאת, אנו יכולים להגדיר את הפרמטר [requestTypes|COutputCache::requestTypes]:

~~~
[php]
...other HTML content...
«?php if($this-»beginCache($id, array('requestTypes'=»array('GET')))) { ?»
...content to be cached...
«?php $this-»endCache(); } ?»
...other HTML content...
~~~

קינון נתונים
--------------

ניתן לקנן בעת השימוש בשמירת נתונים במטמון. זאת אומרת, שחתיכה הנשמרת במטמון עטופה בחתיכה גדולה יותר אשר גם היא נשמרת במטמון. לדוגמא, התגובות של הודעה נשמרות במטמון פנימי, והם נשמרות במטמון ביחד עם התוכן של ההודעה במטמון חיצוני.

~~~
[php]
...other HTML content...
«?php if($this-»beginCache($id1)) { ?»
...outer content to be cached...
    «?php if($this-»beginCache($id2)) { ?»
    ...inner content to be cached...
    «?php $this-»endCache(); } ?»
...outer content to be cached...
«?php $this-»endCache(); } ?»
...other HTML content...
~~~

ניתן להגדיר אפשרויות שונות לכל שמירה במטמון במצב של קינון. לדוגמא, בקוד למעלה השמירה של המטמון הפנימית והחיצונית יכולות להיות מוגדרות עם מאפיין תקופת קיום שונות אחד מהשני. כשהתוכן הנשמר במטמון החיצוני ימחק, התוכן הנשמר במטמון הפנימי עדיין יכול לספק תוכן תקני ועדכני של אותה חתיכה שנשמרה במטמון. למרות שזה לא תקף במקרה ההפוך. במידה והשמירה במטמון החיצוני תקפה וקיימת, היא תמיד תוצג, גם אם התוכן במטמון הפנימי שנשמר כבר לא תקף וצריך להחליפו.

«div class="revision"»$Id: caching.fragment.txt 956 2009-04-21 15:16:03Z qiang.xue@gmail.com $«/div»